#!/usr/bin/env python  # encoding: utf-8
'''
  @author: HJW
  @license: (C) Copyright 2013-2017, Node Supply Chain Manager Corporation Limited.
  @contact: hejunwang01@126.com
  @file: Page.py
  @time: 2022/7/7 0007 下午 23:25
  @desc:
  '''
from selenium.webdriver.common.by import By

'''
POM   page     object    module    
        页面 ,  对象      模型   

通过pytest的DDT 数据驱动 来进行参数的传递 
执行测试用例 ,输出测试报告 pytest-html

sleep()： 强制等待，设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() ，
 导入 time 包后就可以使用 sleep()，进行脚本的执行过程进行休眠。

隐式等待:implicitly_wait()  ，这个隐式等待会在WebDriver对象实例的整个生命周期起作用，它不针对某一个元素，是全局元素等待，即在定位元素时，
需要等待页面全部元素加载完成，才会执行下一个语句。如果超出了设置时间的则抛出异常
缺点：当页面某些js无法加载，但是想找的元素已经出来了，它还是会继续等待，
直到页面加载完成（浏览器标签左上角圈圈不再转），才会执行下一句。某些情况下会影响脚本执行速度。

显示等待:WebDriverWait() 
。在设置时间内，默认每隔一段时间检测一次当前页面元素是否存在，如果超过设置时间检测不到则抛出异常。
默认检测频率为 0.5s，默认抛出异常为：NoSuchElementException

在搭建ui自动化框架，使用的是po设计模式，也就是把每一个页面所需要操作的元素和步骤都封装成一个页面类中。
然后使用selenium+unittest搭建
四层框架实现数据、脚本、业务逻辑分离（关键字驱动）。
其中四层框架包括基础层（BasePage）、业务逻辑层（Pages）、数据层（Data）、测试用例层（Testcase）

主要分三层：
1.基础层BasePage：封装一些最基础的selenium的原生的api方法，元素定位，框架跳转等。

2.PO层：元素定位、获得元素对象，页面动作    ,  可以把 元素定位 方法放到ini文件中 

3.测试用例层：业务逻辑，数据驱动！
————————————————


'''
from selenium import  webdriver
from selenium.webdriver.support.ui import WebDriverWait

class BasePageObj():            # 对象定义
    '''
     定义基类 , 打开 ,关闭 ,查找元素 , 退出等
    '''
    def __int__(self,driver):
        self.driver = driver   # 获取driver

    # 定位
    def open(self,url):
        self.driver.maximize_window()
        self.driver.get(url)

    # 定位
    def locator(self,*loc):
        try:
            wait =WebDriverWait(self.driver,timeout = 10)
            # 使用匿名函数  # 显示等待,自定义等待条件
            wait.until(lambda x: x.find_elements(*loc).is_displayed())
            return self.driver.find_elements(*loc)
        except Exception as e  :
            print(e)
            # raise "Time out"

    #输入
    def input(self,loc,text):
        self.locator(loc).send_keys(text)

    #点击
    def click(self,loc):
        self.locator(loc).click()
    # 关闭
    def close(self):
        self.driver.quit()



